package Facade;

import java.util.ArrayList;

import HereClass.Chat;
import HereClass.Compartilhador;
import HereClass.ControladorMensageiro;
import HereClass.ControleLogin;
import HereClass.ManutencaoDeConta;
import HereClass.UsuariosConectados;

public class FachadaDeNegocio {

	private ManutencaoDeConta manutencaoConta;
	private UsuariosConectados usuariosConectados;
	private ControleLogin control;
	private Compartilhador compartilhador;
	private ControladorMensageiro controladorMensageiro;

	private static FachadaDeNegocio instanciaUnica = null;
	
	protected FachadaDeNegocio() {
		this.manutencaoConta = ManutencaoDeConta.getInstance();
		this.usuariosConectados = UsuariosConectados.getInstance();
		this.control = new ControleLogin();
		this.compartilhador = new Compartilhador();
		this.controladorMensageiro = new ControladorMensageiro();

	}
	
	public static FachadaDeNegocio getInstance(){
		if (instanciaUnica == null)
			instanciaUnica = new FachadaDeNegocio();
		return instanciaUnica;
	}
	
	public void zerarSistema(){
		new FachadaDeArmazenamento().getInstance().zerarSistema();
	}
	
	public void criarUsuario(String userName, String nome, String email,
			String senha, String telefone) throws Exception {
		manutencaoConta.criarUsuario(userName, nome, email, senha, telefone);
	}

	public String getUsuarioPorNome(String nome, int indice) throws Exception {
		return manutencaoConta.getUsuarioPorNome(nome, indice);
	}

	public String getAtributoUsuario(String id, String atributo)
			throws Exception {
		return manutencaoConta.getAtributoUsuario(id, atributo);
	}

	public void atualizarUsuario(String id, String atributo, String valor)
			throws Exception {
		manutencaoConta.atualizarUsuario(id, atributo, valor);
	}

	public void removerUsuario(String id) throws Exception {
		manutencaoConta.removerUsuario(id);
	}

	// Facade da US2.txt

	public int login(String userName, String senha, String IP) throws Exception {
		return control.login(userName, senha, IP);
	}
	
	public String getUserName(String id) {
		return usuariosConectados.getUsuario(id).getUserName();
	}

	public boolean estaConectado(String id) {
		return control.estaConectado(id);
	}

	public void logout(String id) throws Exception {
		control.logout(id);
	}

	public int cadastrarUsuario(String userName, String nome, String email,
			String senha, String telefone, String IP) throws Exception {
		return control.cadastrarUsuario(userName, nome, email, senha, telefone,
				IP);
	}

	// Facade da US3.txt

	public String getLocalizadores() throws Exception {
		return compartilhador.getLocalizadores();
	}

	public String obterLocalizacao(String usuario) throws Exception {
		return compartilhador.obterLocalizacao(usuario);
	}

	public void setLocalizacao(String id, String latitude, String longitude)
			throws Exception {
		compartilhador.setLocalizacao(id, latitude, longitude);
	}

	public String getLocalizacao(String id) {
		return compartilhador.getLocalizacao(id);
	}

	// Facade da US4.txt

	public void initMensageiro(String tipo) {
        this.controladorMensageiro.initMensageiro(tipo);
    }

    public void setDiretorioGabaritos(String diretorio) {
        this.controladorMensageiro.setDiretorioGabaritos(diretorio);
    }

	public String enviarConvite(String indc, String email) {
		return controladorMensageiro.enviarConvite(indc, email);
	}

	public void confirmarCompartilhamento(int de, String com, int modo) {
		compartilhador.confirmar(de, com, modo);
	}

	public void recusarCompartilhamento(String de, String com) {
		this.compartilhador.recusarCompartilhamento(de, com);
	}

	public String getAmigos(String id) throws Exception {
		return compartilhador.getAmigos(id);
	}
	
	public boolean removeConvite (String id, String de) {
		return this.compartilhador.removeConvite(id, de);
	}

	// FAcade us5

	public boolean possoVerLocalizacao(String id, String amigo)
			throws Exception {
		return compartilhador.possoVerLocalizacao(id, amigo);
	}

	public void setCompartilhamento(String id, String amigo, int modo)
			throws Exception {
		compartilhador.setCompartilhamento(id, amigo, modo);
	}

	public void removerAmigo(String id, String amigo) throws Exception {
		compartilhador.removerAmigo(id, amigo);
	}

	// Facade da US6.txt

	public String getLocalizacaoAmigo(String usuario, String amigo)
			throws Exception {
		return compartilhador.getLocalizacaoAmigo(usuario, amigo);
	}

	// Facade da US7

	public String enviarEmail(String de, String para, String assunto, String msg){
		
		return controladorMensageiro.enviarEmail(de, para, assunto, msg);
	}
	
		
	public String enviarSMS(String de, String para, String msg){
		return controladorMensageiro.enviarSMS(de, para, msg);
	}

	public void setPortChat(int port) {

	}

	public void initChat(int id1, int id2) {
		controladorMensageiro.iniciaChat(id1, id2);
	}

	public void enviarMensagemChat(int para, String msg) {
		controladorMensageiro.enviarMensagemChat(para, msg);
	}

	public String receberMensagem(int de) {
		return controladorMensageiro.getMsg(de);
	}

	public void encerrarChat(int id1, int id2) {
		controladorMensageiro.returnLog();
	}

	public ArrayList<String> getConvitesPendentes(String de) {
		return this.compartilhador.getConvitesPendentes(usuariosConectados.getUsuario(de).getEmail());
	}

	
}
